﻿using iS3.Server.Core.Core;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace iS3.Server.Core.Util
{
    public class WebRequestContext
    {
        private string BaseUri="";
        private string Access_Token=null;
        public WebRequestContext(HttpRequestMessage request)
        {
           if ((request!=null) && (request.Headers.Authorization != null))
            {
                this.Access_Token = request.Headers.Authorization.Parameter;
            }
           
        }
        public void SetBaseURL(string baseUri)
        {
            this.BaseUri = baseUri;
        }
        #region Delete方式
        public object Delete(string data, string uri)
        {
            return CommonHttpRequest(data, uri, "DELETE");
        }

        public object Delete(string uri)
        {
            //Web访问对象64
            string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            myRequest.Method = "DELETE";
            // 获得接口返回值68
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            //string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd());
            string ReturnXml = reader.ReadToEnd();
            reader.Close();
            myResponse.Close();
            return ReturnXml;
        }
        #endregion

        #region Put方式
        public object Put(string data, string uri)
        {
            return CommonHttpRequest(data, uri, "PUT");
        }
        #endregion

        #region POST方式实现
        public object Post(object obj, string uri)
        {
            return Post(JsonConvert.SerializeObject(obj), uri);
        }
        public object Post(string data, string uri)
        {
            return CommonHttpRequest(data, uri, "POST");
        }

        public object CommonHttpRequest(string data, string uri, string type)
        {
            try
            {
                string serviceUrl = "";
                //Web访问对象，构造请求的url地址
                if (uri.StartsWith("http"))
                {
                    serviceUrl = uri;
                }
                else
                {
                    serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri); 
                }
                

                //构造http请求的对象
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
                //转成网络流
                byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
                //设置
                myRequest.Method = type;
                myRequest.ContentLength = buf.Length;
                myRequest.ContentType = "application/json";
                myRequest.MaximumAutomaticRedirections = 1;
                myRequest.AllowAutoRedirect = true;
                // 发送请求
                Stream newStream = myRequest.GetRequestStream();
                newStream.Write(buf, 0, buf.Length);
                newStream.Close();
                // 获得接口返回值
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                string ReturnXml = reader.ReadToEnd();
                reader.Close();
                myResponse.Close();
                iS3Result res = JsonConvert.DeserializeObject<iS3Result>(ReturnXml);
                if (res.success)
                {
                    return res.data;
                }
                else
                {
                    throw new iS3Exception(res.error);
                }
            }
            catch (Exception ex)
            {
                throw new iS3Exception(ex.ToString());
            }
        }
        #endregion

        #region GET方式实现
        public object Get(string uri)
        {
            //Web访问对象64
            string serviceUrl = "";
            if ((BaseUri == null) || (BaseUri == ""))
            {
                serviceUrl = string.Format("{0}",  uri); ;
            }
            else
            {
                serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
            }


            //构造一个Web请求的对象
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            if (this.Access_Token != null)
            {
                myRequest.Headers.Add(string.Format("Authorization:Bearer {0}", this.Access_Token));
            }

            // 获得接口返回值68
            //获取web请求的响应的内容
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

            //通过响应流构造一个StreamReader
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            //string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd());
            string ReturnXml = reader.ReadToEnd();
            reader.Close();
            myResponse.Close();
            iS3Result res = JsonConvert.DeserializeObject<iS3Result>(ReturnXml);
            if (res.success)
            {
                return res.data;
            }
            else
            {
                throw new iS3Exception(res.error);
            }
        }
        #endregion
    }
}
